package com.zj.esproxy.interfaces.impl;

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.zj.baseproxy.model.Page;
import com.zj.esproxy.interfaces.EsBaseMapper;
import com.zj.esproxy.interfaces.EsProxy;
import com.zj.esproxy.wrapper.EsWrapper;
import net.bytebuddy.implementation.bind.annotation.This;

import javax.annotation.Resource;

/**
 * @author arthur_zhou
 * @date 2023/10/8 12:10
 */
public class EsBaseMapperImpl {

    @Resource
    private EsProxy esProxy;

    /**
     * 请求es获取数据
     *
     * @param json       请求json
     * @param baseMapper 请求这个方法的对象
     * @return 响应json
     */
    public JSONObject getJson(String json, @This EsBaseMapper<?> baseMapper) {
        return esProxy.getJsonData(baseMapper.getEsInfo(), json);
    }

    /**
     * 请求es获取数据
     *
     * @param wrapper    请求json
     * @param baseMapper 请求这个方法的对象
     * @return 响应json
     */
    public JSONObject getJson(EsWrapper wrapper, @This EsBaseMapper<?> baseMapper) {
        return esProxy.getJsonData(baseMapper.getEsInfo(), JSONObject.toJSONString(wrapper));
    }

    /**
     * 请求es获取数据
     *
     * @param json       请求json
     * @param baseMapper 请求这个方法的对象
     * @return 响应
     */
    public <T> Page<T> get(String json, @This EsBaseMapper<T> baseMapper) {
        return esProxy.getData(baseMapper.getTypeClz(), baseMapper.getEsInfo(), json);
    }

    /**
     * 请求es获取数据
     *
     * @param json       请求json
     * @param baseMapper 请求这个方法的对象
     * @return 响应
     */
    public <T> Page<T> get(String json, Class<T> clazz, @This EsBaseMapper<?> baseMapper) {
        return esProxy.getData(clazz, baseMapper.getEsInfo(), json);
    }

    /**
     * 请求es获取数据
     *
     * @param wrapper    条件拼接器
     * @param baseMapper 请求这个方法的对象
     * @return 响应json
     */
    public <T> Page<T> get(EsWrapper wrapper, Class<T> clazz, @This EsBaseMapper<?> baseMapper) {
        return esProxy.getData(clazz, baseMapper.getEsInfo(), JSON.toJSONString(wrapper));
    }

    /**
     * 请求es获取数据
     *
     * @param wrapper    条件拼接器
     * @param baseMapper 请求这个方法的对象
     * @return 响应json
     */
    public <T> Page<T> get(EsWrapper wrapper, @This EsBaseMapper<T> baseMapper) {
        return esProxy.getData(baseMapper.getTypeClz(), baseMapper.getEsInfo(), JSON.toJSONString(wrapper));
    }

    /**
     * 请求es获取数据
     *
     * @param json       请求json
     * @param baseMapper 请求这个方法的对象
     * @return 响应
     */
    public <T> Page<T> getDistinct(String json, @This EsBaseMapper<T> baseMapper) {
        return esProxy.getDistinctData(baseMapper.getTypeClz(), baseMapper.getEsInfo(), json);
    }

    /**
     * 请求es获取数据
     *
     * @param json       请求json
     * @param baseMapper 请求这个方法的对象
     * @return 响应
     */
    public <T> Page<T> getDistinct(String json, Class<T> clazz, @This EsBaseMapper<?> baseMapper) {
        return esProxy.getDistinctData(clazz, baseMapper.getEsInfo(), json);
    }

    /**
     * 请求es获取数据
     *
     * @param wrapper    条件拼接器
     * @param baseMapper 请求这个方法的对象
     * @return 响应json
     */
    public <T> Page<T> getDistinct(EsWrapper wrapper, Class<T> clazz, @This EsBaseMapper<?> baseMapper) {
        return esProxy.getDistinctData(clazz, baseMapper.getEsInfo(), JSON.toJSONString(wrapper));
    }

    /**
     * 请求es获取数据
     *
     * @param wrapper    条件拼接器
     * @param baseMapper 请求这个方法的对象
     * @return 响应json
     */
    public <T> Page<T> getDistinct(EsWrapper wrapper, @This EsBaseMapper<T> baseMapper) {
        return esProxy.getDistinctData(baseMapper.getTypeClz(), baseMapper.getEsInfo(), JSON.toJSONString(wrapper));
    }
}
